#include "stdafx.h"
#pragma once
//-------------------------------------------------------------------------------------------------
//ImageObject.h  - Object found in Image: (abstract base class)               
//-------------------------------------------------------------------------------------------------
//FreeBSD License
//Copyright 2011 Will Stott All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are
//permitted provided that the following conditions are met:
//
//   1. Redistributions of source code must retain the above copyright notice, this list of
//      conditions and the following disclaimer.
//
//   2. Redistributions in binary form must reproduce the above copyright notice, this list
//      of conditions and the following disclaimer in the documentation and/or other materials
//      provided with the distribution.
//
//THIS SOFTWARE IS PROVIDED BY Will Stott ``AS IS'' AND ANY EXPRESS OR IMPLIED
//WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Will Stott OR
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
//ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
//ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//The views and conclusions contained in the software and documentation are those of the
//authors and should not be interpreted as representing official policies, either expressed
//or implied, of Will Stott.
//
//----Authors--------------------------------------------------------------------------------------
//created by: will.stott@ucl.ac.uk July 2011
//
//----Comments-------------------------------------------------------------------------------------
//
// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the IMAGEPROCLIB_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// IMAGEPROCLIBAPI functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
//--------------------------------------------------------------------------------------------------

#ifdef IMAGEPROCLIB_EXPORTS
#define IMAGEPROCLIBAPI __declspec(dllexport)
#else
#define IMAGEPROCLIBAPI __declspec(dllimport)
#endif

#include <string>
#include <time.h>

#include "ImageObjectType.h"
#include "ImageType.h"
#include "ImageTypeProp.h"
#include "ImageProp.h"
#include "ImageRect.h"

class ImageProps;

class IMAGEPROCLIBAPI ImageObject 
{
public:

private:
	ImageObjectType *_pImageObjectType; //set in ctor - make sure derived types instantiate
	std::string _timestampStr;			//time when image object first created - seconds since 1/1/1970
	std::string _DisplayName;			//used only to help identify the image object when displayed
	int			_DisplayId;				//number of this image object type - used only to help identify the image object when displayed

//#pragma warning(disable:4251)
	std::vector<ImageProp *>   _imageObjectProperties;				//XML defined properties for image object- quality, etc
//#pragma warning(default:4251)

public:
	ImageObject::ImageObject(ImageObjectType *pObjType) ;
	virtual ~ImageObject(void);

	static ImageObject *  Create(ImageObjectType *pObjType, ImageProps *pImageProps);

	virtual bool		  AssignFrom(ImageObject *pObjectToCopy) = 0;
	virtual bool		  LoadProperties(TiXmlElement *pImageObjectXml) = 0;
	virtual bool		  SaveProperties(TiXmlElement *pImageObjectXml) = 0;
	
	virtual void		SetNote( const char *note) = 0;
	virtual const char *GetNote() = 0;
	virtual	ImageRect  *GetContainingRect() = 0;	

	ImageObjectType *GetImageObjectType() {return _pImageObjectType; }

	int				 GetPropertyCnt() { return _imageObjectProperties.size(); }
	ImageProp		*GetProperty(int index) { return ((index >= 0) && (index < GetPropertyCnt())) ? _imageObjectProperties[index] : '\0'; }
	ImageProp		*GetProperty(const char *Name);
	TiXmlElement    *GetImageObjectXml(TiXmlElement *pImageXml);
	bool			 HasProperty(const char *Name) { return ((GetProperty(Name) == '\0') ? false : true); }

	const char     *GetDisplayName() { return _DisplayName.c_str(); }
	const char     *GetName() { return _timestampStr.c_str(); }

protected:
	bool			LoadXmlDefinedProperties(TiXmlElement *pImageObjectXml);
	bool			SaveXmlDefinedProperties(TiXmlElement *pImageObjectXml);
	bool			SetName(const char *timestamp);						//when image object loaded from IDF
	void			SetImageObjectType(ImageObjectType *pImageObjectType) {_pImageObjectType = pImageObjectType; }	//only for AssignFrom
private:
	ImageObject(void);

	bool			SetName(int DisplayId);								//when image object originally created by user
	ImageProp	   *SetXmlDefinedProperty(const char *xmlPropName, const char *xmlPropValue);
	bool			CreateImageObjectProperties();
	bool			ClearAllImageObjectProperties();

};


//-------------------------------------------------------------------------------------------------
//			E N D   O F   F I L E
//-------------------------------------------------------------------------------------------------

